﻿
#ifndef APP_ESTRANSFORM_H
#define APP_ESTRANSFORM_H

/**
 *  4乘4 矩阵
 */
typedef struct
{
    float m[4][4];
} ESMatrix;

/**
 *  将result指定的矩阵乘以比例缩放矩阵，并在result中返回新矩阵
 *
 *  @param result 输入矩阵
 *  @param sx     指定x轴上的比例缩放因子
 *  @param sy     指定y轴上的比例缩放因子
 *  @param sz     指定z轴上的比例缩放因子
 */
void esScale(ESMatrix* result, float sx, float sy, float sz);

/**
 *  将result指定的矩阵乘以平移矩阵，并在result中返回新矩阵
 *
 *  @param result 输入矩阵
 *  @param tx     指定x轴上的平移因子
 *  @param ty     指定y轴上的平移因子
 *  @param tz     指定z轴上的平移因子
 */
void esTranslate(ESMatrix* result, float tx, float ty, float tz);

/**
 *  将result指定的矩阵乘以旋转矩阵，并在result中返回
 *
 *  @param result 输入矩阵
 *  @param angle  指定旋转角度，以度数表示
 *  @param x      指定旋转轴的向量，向量的x
 *  @param y      指定旋转轴的向量，向量的y
 *  @param z      指定旋转轴的向量，向量的z
 */
void esRotate(ESMatrix* result, float angle, float x, float y, float z);

/**
 *  将result表示的矩阵乘以透视投影矩阵，并在result中返回新矩阵
 *
 *  @param result 输入矩阵
 *  @param left   指定左裁剪平面
 *  @param right  指定右裁剪平面
 *  @param bottom 指定下裁剪平面
 *  @param top    指定上裁剪平面
 *  @param nearZ  指定近深度裁剪平面
 *  @param farZ   指定远深度裁剪平面
 */
void esFrustum(ESMatrix* result, float left, float right, float bottom, float top, float nearZ, float farZ);

/**
 *  将result指定的矩阵乘以透视投影矩阵，并在result中返回新矩阵。提供该函数是为了比直接使用esFrustum更简单地创建透视矩阵
 *
 *  @param result 输入矩阵
 *  @param fovy   指定以度数表示的视野，应该在 0 ～ 180 之间
 *  @param aspect 渲染窗口的纵横比（宽度/高度）
 *  @param nearZ  指定近深度裁剪平面
 *  @param farZ   指定远深度裁剪平面
 */
void esPerspective(ESMatrix* result, float fovy, float aspect, float nearZ, float farZ);

/**
 *  将result指定的矩阵乘以正交投影矩阵，交在result中返回新矩阵
 *
 *  @param result 输入矩阵
 *  @param left   指定左裁剪平面
 *  @param right  指定右裁剪平面
 *  @param bottom 指定下裁剪平面
 *  @param top    指定上裁剪平面
 *  @param nearZ  指定近深度裁剪平面
 *  @param farZ   指定远深度裁剪平面
 */
void esOrtho(ESMatrix* result, float left, float right, float bottom, float top, float nearZ, float farZ);

/**
 *  这个函数将 srcA 和 srcB 矩阵相乘，并在result中返回结果。 result = srcA x srcB
 *
 *  @param result 指定返回相乘后矩阵的内存的指针
 *  @param srcA   指定乘法运算的输入矩阵A
 *  @param srcB   指定乘法运算的输入矩阵B
 */
void esMatrixMultiply(ESMatrix* result, ESMatrix* srcA, ESMatrix* srcB);

/**
 *  这个函数将 srcA矩阵 和 srcB 列向量相乘，并在result中返回结果。 result = srcA x srcB
 *
 *  @param result 指定返回相乘后矩阵的内存的指针
 *  @param srcA   指定乘法运算的输入矩阵A
 *  @param srcB   指定乘法运算的输入列向量B
 */
void esMatrixVectorMultiply(float* result, ESMatrix* srcA, float* srcB);

/**
 *  取得单位矩阵
 *
 *  @param result 指向返回单位矩阵的内存指针
 */
void esMatrixLoadIdentity(ESMatrix* result);

/**
 *  用眼睛的位置、视线向量和上向量生成一个视图变换矩阵
 *
 *  @param result  输出矩阵
 *  @param posX    指定眼睛位置的x坐标
 *  @param posY    指定眼睛位置的y坐标
 *  @param posZ    指定眼睛位置的z坐标
 *  @param lookAtX 指定视线向量的x
 *  @param lookAtY 指定视线向量的y
 *  @param lookAtZ 指定视线向量的z
 *  @param upX     指定上向量的x
 *  @param upY     指定上向量的y
 *  @param upZ     指定上向量的z
 */
void esMatrixLookAt(ESMatrix* result,
    float posX, float posY, float posZ,
    float lookAtX, float lookAtY, float lookAtZ,
    float upX, float upY, float upZ);


#endif //APP_ESTRANSFORM_H
